package cn.ducis.macaw.core.staticflies.file;

import java.util.Map;

import cn.ducis.macaw.core.bPlusTree.*;

/**
 * 二级索引相关
 * 
 * @author Yellow
 *
 */
public class Index {
	// Map文件存放的目录
	private static String mapsDir;
	// 一级索引树文件存放目录
	private static String treeDir;
	// 二级索引Map文件存放在文件系统的后缀（暂定imap，index map）
	private static final String MAP_SUFFIX = ".imap";
	// 一级索引树文件后缀
	private static final String TREE_SUFFIX = ".itree";

	/**
	 * 存储索引树到指定路径
	 * 
	 * @param tree
	 */
	public static void storeTree(BPlusTree tree) {
		// 目标文件夹若不存在，先生成文件夹
		String dir = BlockFile.generateDir(treeDir);
		FileParse.writeFile(FileParse.serialize(tree), dir + "/" + treeName() + TREE_SUFFIX);
	}

	/**
	 * @return 索引树文件名
	 */
	public static String treeName() {
		// TODO
		return "indextree";
	}

	/**
	 * 从序列化后存放索引树的文件中重新提出B+树对象
	 * 
	 * @param treePath
	 * @return 文件对应的B+树对象
	 */
	public static BPlusTree takeTree(String treePath) {
		return (BPlusTree) FileParse.unserialize(FileParse.fileToArray(treePath));
	}

	public static BPlusTree takeTree() {
		return (BPlusTree) FileParse.unserialize(FileParse.fileToArray(treeDir + "/" + treeName() + TREE_SUFFIX));
	}
	
	/**
	 * 将序列化后的Map存放到指定路径
	 * 
	 * @param fileMaps
	 *            要存放的Map
	 * @param mapName
	 *            索引map的文件的名称
	 */
	public static void storeFileMap(Map<String, String> fileMaps, String mapName) {
		String dir = BlockFile.generateDir(mapsDir);
		FileParse.writeFile(FileParse.serialize(fileMaps), dir + "/" + mapName + MAP_SUFFIX);
	}

	/**
	 * 从序列化后存放Map的文件中重新提出Map对象
	 * 
	 * @param mapPath
	 * @return 文件对应的Map对象
	 */
	public static Map<String, String> takeFileMaps(String mapPath) {
		return (Map<String, String>) FileParse.unserialize(FileParse.fileToArray(mapPath));
	}

	public static String getMapsDir() {
		return mapsDir;
	}

	public static void setMapsDir(String mapsDir) {
		Index.mapsDir = mapsDir;
	}

	public static String getTreeDir() {
		return treeDir;
	}

	public static void setTreeDir(String treeDir) {
		Index.treeDir = treeDir;
	}

	public static String getMapSuffix() {
		return MAP_SUFFIX;
	}

	public static String getTreeSuffix() {
		return TREE_SUFFIX;
	}

	
}
